package com.wnzt.baszh.util.common;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

public class SetSystemProperty {

	 //属性文件的路径
    //static String profilepath=Thread.currentThread().getContextClassLoader().getResource("").getPath()+"/Quartz_pop.properties";
    
    /**
    * 采用静态方法
    */
    private static Properties props = new Properties();
    
    static {
        /*try {
            //props.load(new InputStreamReader(new FileInputStream(profilepath), "UTF-8"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.exit(-1);
        } catch (IOException e) {       
            System.exit(-1);
        }*/
    }

    /**
    * 读取属性文件中相应键的值
    * @param key
    *            主键
    * @return String
    */
    public static String getKeyValue(String key) {
        return props.getProperty(key);
    }

    /**
    * 根据主键key读取主键的值value
    * @param filePath 属性文件路径
    * @param key 键名
    */
    public static String readValue(String filePath, String key) {
        Properties props = new Properties();
        try {
            InputStream in = new BufferedInputStream(new FileInputStream(filePath));
            props.load(in);
            String value = props.getProperty(key);
            System.out.println(key +"键的值是："+ value);
            return value;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
   
    /**
    * 更新（或插入）一对properties信息(主键及其键值)
    * 如果该主键已经存在，更新该主键的值；
    * 如果该主键不存在，则插件一对键值。
    * @param keyname 键名
    * @param keyvalue 键值
    */
    public static void writeProperties(String keyname,String keyvalue) {       
        try {
            // 调用 Hashtable 的方法 put，使用 getProperty 方法提供并行性。
            // 强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
        	String profilepath=Thread.currentThread().getContextClassLoader().getResource("").getPath()+"/Quartz_pop.properties";
            OutputStream fos = new FileOutputStream(profilepath);
            props.setProperty(keyname, keyvalue);
            // 以适合使用 load 方法加载到 Properties 表中的格式，
            // 将此 Properties 表中的属性列表（键和元素对）写入输出流
            props.store(fos, "Update '" + keyname + "' value");
        } catch (IOException e) {
            System.err.println("属性文件更新错误");
        }
    }

    /**
    * 更新properties文件的键值对
    * 如果该主键已经存在，更新该主键的值；
    * 如果该主键不存在，则插件一对键值。
    * @param keyname 键名
    * @param keyvalue 键值
    */
    public static void updateProperties(String keyname,String keyvalue) {
        try {
        	String profilepath=Thread.currentThread().getContextClassLoader().getResource("").getPath();
        	profilepath=profilepath+"/config.properties";
            props.load(new InputStreamReader(new FileInputStream(profilepath), "UTF-8"));
            // 调用 Hashtable 的方法 put，使用 getProperty 方法提供并行性。
            // 强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
            OutputStream fos = new FileOutputStream(profilepath);           
            props.setProperty(keyname, keyvalue);
            // 以适合使用 load 方法加载到 Properties 表中的格式，
            // 将此 Properties 表中的属性列表（键和元素对）写入输出流
            props.store(fos, "Update '" + keyname + "' value");
        } catch (IOException e) {
            System.err.println("属性文件更新错误");
        }
    }
    
    public static Map<String, String> propertiesToMap(String filePath){
    	
    	Properties properties = new Properties();
    	Map<String, String> map=null;
		try {
			properties.load(new InputStreamReader(new FileInputStream(filePath), "UTF-8"));
	        map = new HashMap<String, String>((Map) properties);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    	
        return map;
    }
    
    /**
     * 属性文件向Bean赋值
     * @param bean
     * @param prop
    */
    public static void propertyToBean(Object bean,String filePath){
    	Properties prop = new Properties();
		try {
			prop.load(new InputStreamReader(new FileInputStream(filePath), "UTF-8"));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	    if(prop == null)return;
	    Iterator<Object> keyIt = prop.keySet().iterator();
	    Class beanClass = bean.getClass();
		while(keyIt.hasNext()){
			try{
			    String key = (String)keyIt.next();
			    String value = prop.getProperty(key);
			
			    Field field = beanClass.getDeclaredField(key);
			    Class fieldClass = field.getType();
			    Method method = beanClass.getDeclaredMethod("set"+initialUpperCase(key), fieldClass);
			
			    String simpleName = fieldClass.getSimpleName();
			    if(simpleName.equals("boolean")){
			    	method.invoke(bean, Boolean.parseBoolean((String)value));
			    }else if(simpleName.equals("String")){
			    	method.invoke(bean, value);
			    }else{
				    BigDecimal bd = new BigDecimal(value);
				    Method convertMethod = bd.getClass().getDeclaredMethod(simpleName+"Value");
				    method.invoke(bean, convertMethod.invoke(bd));
			    }
			}catch(NoSuchFieldException ex){
				continue;
		    }catch(Exception ex){
		    	
		    }
		}
    }
    
    /**
     * 首字母大写
     * @param oldString
     * @return
    */
    public static String initialUpperCase(String oldString){
    if(oldString == null || oldString.equals(""))return oldString;
    String target = new StringBuffer().append(oldString.substring(0,1).toUpperCase()).append(oldString.substring(1)).toString();
    return target;
    }
    
    public static void main(String[] args) {
    	String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
    	path = path.replace("/classes/", "");
    	System.out.println(path);
        System.err.println(readValue("/WEB-INF/Quartz_pop.properties", "jobId"));
    }
}
